﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using CrawlerCore;
using HtmlAgilityPack;
using WapCrawlerLib;

namespace WapCrawlerCore.WapCrawler
{
    public class WapTaiWapSite : WapSiteBase
    {
        public WapTaiWapSite(int wapCrawlerId)
            : base(wapCrawlerId)
        {
          
        }

        #region IWapSite Members

        public override void StartCrawler(int topicCrawlerId)
        {
            //Get items of first page
            if (objWapCrawler.recentCrawlerUrl != string.Empty){
                string patternPage = @"trang=(?<page>\d+)$";
                string pagingXPath = ".//div[@class='trang']/a";
                GetPages(objWapCrawler.wapSiteUrl, objWapCrawler.recentCrawlerUrl, patternPage, pagingXPath);
            }
        }

        /// <summary>
        /// Lấy các game trong một trang
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <returns></returns>
        public override bool GetItemsOfPage(string pageUrl)
        {
            bool result = true;
            HtmlDocument doc = Browser.Get(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, pageUrl));
            //Lấy danh sách các bài viết của một page
            HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(".//div[@id='topic']//a");
            if (nodeCollection != null)
            {
                //Xử lý từng bài viết một
                Parallel.ForEach(nodeCollection, node =>
                {
                    //Lấy url và title của bài viết
                    string postTitle = node.InnerText.Trim();
                    string postUrl = node.Attributes["href"].Value;
                    //============================================================
                    //Lấy topic của game
                    string topicName = "Game Việt Hóa";

                    //============================================================
                    //Cập nhật vào csdl
                    UpdateDB(postUrl, postTitle, "", "", topicName);

                    //Lấy thông tin đầy đủ
                    GetItem(postUrl, topicName);
                });
            }
            return result;
        }

        /// <summary>
        /// Lấy đầy đủ nội dung của bài viết
        /// </summary>
        /// <param name="postUrl"></param>
        /// <param name="topicName"></param>
        public override void GetItem(string postUrl, string topicName)
        {
            WapDataClassesDataContext dc = new WapDataClassesDataContext();
            //Lấy post
            PostCrawler objPostCrawler = new PostCrawler();
            objPostCrawler = objPostCrawler.Get(postUrl);
            
            //Load page of a item
            HtmlDocument itemDoc = Browser.Get(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, postUrl));
            if (null == itemDoc)
            {
                return;
            }

            //Note1: get content of a item
            HtmlNodeCollection nodeCollection = itemDoc.DocumentNode.SelectNodes(".//div[@class='game']");
            if (nodeCollection != null)
            {
                string postContent = nodeCollection[0].InnerHtml;
                //Set false để chỉnh sửa lại nội dung, sau khi chỉnh xong set lại true
                objPostCrawler.crawlerStatus = false;

                //========================================================
                //Remove phần nội dung bên dưới của các link download (thường là quảng cáo)
                int index = 0;
                //Lấy các div chứa các link download
                //string patternFiles = ".//div[@class='game']";
                //HtmlNodeCollection removedNodeCollection = nodeCollection[0].SelectNodes(patternFiles);
                //if(removedNodeCollection ==null)
                //{
                //    patternFiles = @".//a[contains(@href,'../taive/') or contains(@href,'http://waptai.com/taive') or contains(@href,'.jar') or contains(@href,'.jad')]";
                //    removedNodeCollection = nodeCollection[0].SelectNodes(patternFiles);    
                //}
                //Pattern của link download
                string patternFiles = @".//a[contains(@href,'../taive/') or contains(@href,'http://waptai.com/taive') or contains(@href,'.jar') or contains(@href,'.jad')]";
                HtmlNodeCollection removedNodeCollection = nodeCollection[0].SelectNodes(patternFiles);
                if (removedNodeCollection != null)
                {
                    //xác định index đầu tiên của tag div chứa link download cuối cùng
                    index = postContent.IndexOf(removedNodeCollection[removedNodeCollection.Count-1].OuterHtml);
                    //xác định index ở vị trí cuối của tag div link download cuối cùng (+ thêm chiều dài của link download cuối cùng)
                    index += removedNodeCollection[removedNodeCollection.Count - 1].OuterHtml.Length;
                    //từ index ở vị trí cuối cùng của tag div link download cuối cùng, xác định tag div kế tiếp
                    index = postContent.IndexOf("<div",index);
                    //xóa bỏ toàn bỏ phần còn lại từ index này
                    if (index > 0)
                        postContent = postContent.Remove(index);
                    else
                        postContent = postContent;
                }

                //========================================================
                //Remove phần "Tải ảnh gốc"
                string[] imgTag = new string[]{"jpg","jpeg","png","bmp","tiff","gif"};
                string xpath = "";
                foreach(string tag in imgTag)
                {
                    xpath +=
                        string.Format(
                            "contains(translate(@href, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'{0}') or ",
                            tag);
                }
                xpath = string.Format(".//a[{0}]", xpath).Replace(" or ]", "]");
                
                removedNodeCollection = nodeCollection[0].SelectNodes(xpath);
                if (removedNodeCollection != null)
                {
                    foreach (HtmlNode aNode in removedNodeCollection)
                        postContent = postContent.Replace(aNode.OuterHtml, "");
                }

                //Sau đó, tiếp tục remove phần đầu trước thẻ <br/>
                index = postContent.IndexOf("<br>");
                postContent = postContent.Remove(0, index);

                //========================================================
                //Get img url
                HtmlNodeCollection imgNodeCollection = nodeCollection[0].SelectNodes(".//img");
                if (imgNodeCollection != null)
                {
                    //foreach (HtmlNode imgNode in imgNodeCollection)
                    for (int i = 0; i < imgNodeCollection.Count; i++)
                    {
                        HtmlNode imgNode = imgNodeCollection[i];
                        if (postContent.IndexOf(imgNodeCollection[i].OuterHtml) > 0)
                        {
                            ImageCrawler objImage = new ImageCrawler();
                            objImage.imageName = objPostCrawler.postTitle;
                            objImage.imageUrl = imgNode.Attributes["src"].Value;
                            objImage.postCrawlerId = objPostCrawler.postCrawlerId;
                            objImage.Insert(objImage);

                            //update postContent
                            postContent = postContent.Replace(imgNode.OuterHtml, string.Format("[IMGTAG{0}]", i + 1));
                        }
                    }
                }

                //ignore first item and last item (it's a main page)
                //Remand items are files
                //HtmlNodeCollection fileNodeCollection = nodeCollection[0].SelectNodes(".//div[@class='game']//a");
                HtmlNodeCollection fileNodeCollection = nodeCollection[0].SelectNodes(patternFiles);
                if (fileNodeCollection != null)
                {
                    for (int i = 0; i < fileNodeCollection.Count; i++)
                    {
                        HtmlNode fileNode = fileNodeCollection[i];
                        if (!postContent.Contains(fileNode.OuterHtml))
                            continue;

                        string fileName = fileNode.InnerHtml;
                        string fileUrl = fileNode.Attributes["href"].Value;
                        //../games/ or ../taive/
                        Regex r = new Regex("^../");
                        Match m = r.Match(fileUrl);
                        if (m.Success){
                            fileUrl = GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, fileUrl);
                        }
                        //Kiểm tra xem link này có phải là file download không
                        int result = Browser.CheckFileExists(fileUrl);
                        bool fileStatus = true;
                        if ( 1== result)
                        {
                            FileCrawler objFileCrawler = new FileCrawler();
                            objFileCrawler.Insert(objPostCrawler.postCrawlerId, fileName, fileUrl, fileStatus);

                            //update postContent
                            postContent = postContent.Replace(fileNode.OuterHtml, string.Format("[FILETAG{0}]", i + 1));
                        }
                        else if (0 == result) //Nếu không phải là file download tiếp tục load
                        {
                            HtmlDocument fileDoc = Browser.Get(fileUrl);
                            //Lấy tất cả file download có thể có
                            HtmlNodeCollection linkNodeCollection = fileDoc.DocumentNode.SelectNodes(".//a[contains(@href,'.jar') or contains(@href,'.jad')]");
                            if (linkNodeCollection != null)
                            {
                                foreach (HtmlNode linkNode in linkNodeCollection)
                                {
                                    fileUrl = linkNode.Attributes["href"].Value;
                                    //Lấy chính xác link file (bỏ qua link quảng cáo)
                                    r = new Regex("http.*(?<url>http.*$)");
                                    m = r.Match(fileUrl);
                                    if (m.Success)
                                    {
                                        fileUrl = m.Result("${url}");
                                        //Kiểm tra nếu file nào tồn tại thì mới tiếp tục lưu vào csdl
                                        result = Browser.CheckFileExists(fileUrl);
                                        if (-1 == result) //file not found
                                            fileStatus = false;
                                        FileCrawler objFileCrawler = new FileCrawler();
                                        objFileCrawler.Insert(objPostCrawler.postCrawlerId, fileName, fileUrl, fileStatus);

                                        //update postContent
                                        postContent = postContent.Replace(fileNode.OuterHtml, string.Format("[FILETAG{0}]", i + 1));
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                //Lấy chính xác link file (bỏ qua link quảng cáo)
                                r = new Regex("http.*(?<url>http.*$)");
                                m = r.Match(fileUrl);
                                if (m.Success)
                                {
                                    fileUrl = m.Result("${url}");
                                    //Kiểm tra nếu file nào tồn tại thì mới tiếp tục lưu vào csdl
                                    result = Browser.CheckFileExists(fileUrl);
                                    if (-1 == result) //file not found
                                        fileStatus = false;
                                    FileCrawler objFileCrawler = new FileCrawler();
                                    objFileCrawler.Insert(objPostCrawler.postCrawlerId, fileName, fileUrl, fileStatus);

                                    //update postContent
                                    postContent = postContent.Replace(fileNode.OuterHtml, string.Format("[FILETAG{0}]", i + 1));
                                }
                            }
                        }
                        else
                        {
                            //file not found
                            fileStatus = false;
                            FileCrawler objFileCrawler = new FileCrawler();
                            objFileCrawler.Insert(objPostCrawler.postCrawlerId, fileName, fileUrl, fileStatus);

                            //update postContent
                            postContent = postContent.Replace(fileNode.OuterHtml, string.Format("[FILETAG{0}]", i + 1));
                        }
                    }
                }

                //format content
                objPostCrawler.postContent = FormatContent(postContent);
            }

            //Crawler a post complete!
            objPostCrawler.crawlerStatus = true;
            dc.SubmitChanges();
        }

        /// <summary>
        /// Lấy các game trong một trang
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <returns></returns>
        public override void Test(string pageUrl, string postTitle)
        {
            HtmlDocument doc = Browser.Get(GeneralClass.GetFullUrl(objWapCrawler.wapSiteUrl, pageUrl));
            //Lấy danh sách các bài viết của một page
            HtmlNodeCollection nodeCollection = doc.DocumentNode.SelectNodes(".//div[@id='topic']//a");
            if (nodeCollection != null)
            {
                //Xử lý từng bài viết một
                Parallel.ForEach(nodeCollection, (node, state) =>
                {
                    //Lấy url và title của bài viết
                    string title = node.InnerText.Trim();
                    if (title == postTitle)
                    {
                        string postUrl = node.Attributes["href"].Value;
                        //============================================================
                        //Lấy topic của game
                        string topicName = "Game Việt Hóa";

                        //============================================================
                        //Cập nhật vào csdl
                        UpdateDB(postUrl, postTitle, "", "", topicName);

                        //Lấy thông tin đầy đủ
                        GetItem(postUrl, topicName);
                        state.Break();
                    }
                });
            }
        }
        
        #endregion
    }
}
